package es.tikitaka.domain.equipo;

import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import es.tikitaka.domain.Temporada;
import es.tikitaka.domain.Titulo;
import es.tikitaka.domain.jugador.PartJugador;
import es.tikitaka.domain.liga.Liga;
import es.tikitaka.domain.playoffs.Playoffs;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Entity
@Table(name = "PARTEQUIPO")
public class PartEquipo implements Comparable<Object> {

	private Integer id;
	private Equipo equipo;
	private Temporada temporada;
	private Set<PartJugador> m_jugadores;
	private Set<SegEquipo> m_seguimientos;
	private PartJugador contacto;
	private Liga liga;
	private Playoffs playoffs;
	private EstEquipo estadisticas;
	private Set<FotoEquipo> m_fotos;
	private int numSorteo;
	private Titulo titulo;

	/**
	 * Constructor por defecto
	 */
	public PartEquipo() {
	}

	/*
	 * getters and setters
	 */

	/**
	 * 
	 * @return id Id de la participación del equipo
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PE_GEN")
	@SequenceGenerator(allocationSize = 1, name = "PE_GEN", sequenceName = "PE_SEQ")
	@Column(name = "X_PE", nullable = false, precision = 10, scale = 0)
	public Integer getId() {
		return id;
	}

	/**
	 * 
	 * @param id
	 */
	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * 
	 * @return equipo Equipo al que pertenece la participación
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "EQUIPO")
	public Equipo getEquipo() {
		return equipo;
	}

	/**
	 * 
	 * @param equipo
	 */
	public void setEquipo(Equipo equipo) {
		this.equipo = equipo;
	}

	/**
	 * 
	 * @return temporada Temporada para la que es válida la participación
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "TEMPORADA")
	public Temporada getTemporada() {
		return temporada;
	}

	/**
	 * 
	 * @param temporada
	 */
	public void setTemporada(Temporada temporada) {
		this.temporada = temporada;
	}

	/**
	 * 
	 * @return m_jugadores Conjunto de participaciones de jugadores que
	 *         conforman el equipo
	 */
	@OneToMany(mappedBy = "equipo", fetch = FetchType.LAZY)
	public Set<PartJugador> getM_jugadores() {
		return m_jugadores;
	}

	/**
	 * 
	 * @param m_jugadores
	 */
	public void setM_jugadores(Set<PartJugador> m_jugadores) {
		this.m_jugadores = m_jugadores;
	}

	/**
	 * 
	 * @return m_seguimientos Conjunto de seguimientos correspondientes a los
	 *         partidos en los que participa
	 */
	@OneToMany(mappedBy = "partEquipo", fetch = FetchType.LAZY)
	public Set<SegEquipo> getM_seguimientos() {
		return m_seguimientos;
	}

	/**
	 * 
	 * @param m_seguimientos
	 */
	public void setM_seguimientos(Set<SegEquipo> m_seguimientos) {
		this.m_seguimientos = m_seguimientos;
	}

	/**
	 * 
	 * @return contacto Jugador que sirve como contacto del equipo
	 */
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "CONTACTO")
	public PartJugador getContacto() {
		return contacto;
	}

	/**
	 * 
	 * @param contacto
	 */
	public void setContacto(PartJugador contacto) {
		this.contacto = contacto;
	}

	/**
	 * 
	 * @return liga Liga en la que participa el equipo
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "LIGA")
	public Liga getLiga() {
		return liga;
	}

	/**
	 * 
	 * @param liga
	 */
	public void setLiga(Liga liga) {
		this.liga = liga;
	}

	/**
	 * 
	 * @return playoffs Playoffs en los que puede o no participar el equipo
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "PLAYOFFS")
	public Playoffs getPlayoffs() {
		return playoffs;
	}

	/**
	 * 
	 * @param playoffs
	 */
	public void setPlayoffs(Playoffs playoffs) {
		this.playoffs = playoffs;
	}

	/**
	 * 
	 * @return estadisticas Estidisticas de la participación del equipo en la
	 *         temporada
	 */
	@OneToOne(fetch = FetchType.LAZY, cascade = { CascadeType.MERGE,
			CascadeType.PERSIST })
	@JoinColumn(name = "ESTADISITICAS")
	public EstEquipo getEstadisticas() {
		return estadisticas;
	}

	/**
	 * 
	 * @param estadisticas
	 */
	public void setEstadisticas(EstEquipo estadisticas) {
		this.estadisticas = estadisticas;
	}

	/**
	 * 
	 * @return m_fotos Conjunto de fotos del equipo
	 */
	@OneToMany(mappedBy = "equipo", fetch = FetchType.LAZY)
	public Set<FotoEquipo> getM_fotos() {
		return m_fotos;
	}

	/**
	 * 
	 * @param m_fotos
	 */
	public void setM_fotos(Set<FotoEquipo> m_fotos) {
		this.m_fotos = m_fotos;
	}

	/**
	 * 
	 * @return numSorteo Número que le toca aleatoriamente para entrar en el
	 *         sorteo del calendario de liga
	 */
	@Column(name = "NUMSORTEO")
	public int getNumSorteo() {
		return numSorteo;
	}

	/**
	 * 
	 * @param numSorteo
	 */
	public void setNumSorteo(int numSorteo) {
		this.numSorteo = numSorteo;
	}

	/**
	 * 
	 * @return
	 */
	@OneToOne(fetch = FetchType.LAZY, cascade = { CascadeType.MERGE,
			CascadeType.PERSIST })
	@JoinColumn(name = "TITULO")
	public Titulo getTitulo() {
		return titulo;
	}

	/**
	 * 
	 * @param titulo
	 */
	public void setTitulo(Titulo titulo) {
		this.titulo = titulo;
	}

	/**
	 * Método equals
	 */
	@Override
	public boolean equals(Object obj) {
		if (!(obj instanceof PartEquipo)) {
			return false;
		}
		if (obj != null) {
			if (this.id == ((PartEquipo) obj).getId()) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Método hashCode
	 */
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return super.hashCode();
	}

	/**
	 * Método compareTo
	 */
	public int compareTo(Object o) {
		PartEquipo e = (PartEquipo) o;
		if (this.temporada.getAnio().getAnio() < e.getTemporada().getAnio()
				.getAnio()) {
			return -1;
		} else if (this.temporada.getAnio().getAnio() == e.getTemporada()
				.getAnio().getAnio()) {
			return 0;
		} else {
			return 1;
		}
	}
}
